package com.qf.automation.file.utils;

import com.madgag.gif.fmsware.AnimatedGifEncoder;
import lombok.extern.slf4j.Slf4j;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;

@Slf4j
public class GifUtil {
    /**
     * 默认每隔多少帧取一帧   步长
     */
    private static final Integer DEFAULT_MARGIN=2;
    /**
     * 默认帧频率
     */
    private static final Integer DEAULT_FRAME_RTE=10;


    /**
     * 截取时评指定帧生成gif
     * @param filePath  视频文件路径
     * @param startFrame  开始帧为止
     * @param frameCount    帧总数
     * @param frameRate 帧频率
     * @param margin    截帧步长
     */
    public static String buildGif(String filePath,int startFrame,int frameCount,Integer frameRate,Integer margin) throws Exception {
        if (margin==null){
            margin=DEFAULT_MARGIN;
        }
        if (frameRate==null){
            frameRate=DEAULT_FRAME_RTE;
        }
        //gif存储路径
        //文件路径，文件名都不变，后缀名设置为gif
        String gifPath=filePath.substring(0,filePath.lastIndexOf("."))+".gif";
        //文件输出流
        FileOutputStream targetFile=new FileOutputStream(gifPath);
        //读取时评文件
        //使用ffmpeg引擎帧读取
        FFmpegFrameGrabber ff=new FFmpegFrameGrabber(filePath);
        //创建一个java的2d画面帧与原视频帧的转化器
        Java2DFrameConverter converter=new Java2DFrameConverter();
        //让ffmpeg引擎开始工作
        ff.start();
        //获取时评总帧数
        Integer videoLength=ff.getLengthInFrames();
        //startFrame>videoLength  开始帧为止，大于总帧数
        // startFrame+frameCount*margin  结束帧为止，大于总帧数
        //在1和2这两种情况夏，我们应该特殊处理
        if (startFrame>videoLength||(startFrame+frameCount*margin)>videoLength){
            //截取1、5~1、2这么多帧
            startFrame=videoLength/5;
            frameCount=(videoLength-startFrame-5)/margin;
        }
        //参数处理完毕，告诉ffmpeg引擎，开始帧为止
        ff.setFrameNumber(startFrame);
        //实例化动图gif编码器
        AnimatedGifEncoder en=new AnimatedGifEncoder();
        //给gif编码器设置帧频率
        en.setFrameRate(frameRate);
        //设置gif无限循环
        en.setRepeat(0);
        //gif编码器堆gif文件进行编码
        en.start(targetFile);
        //设置标记为，标记当前预览图是否已经生成
        boolean poster=false;
        for (int i=0;i<frameCount;i++){
            if (!poster){
                //开启读取一帧
                Frame f=ff.grabFrame();
                if(f!=null){
                    //设置图片宽高，以及未知
                    String jpgPath=filePath.substring(0,filePath.lastIndexOf("."))+".jpg";
                    File jpgFile=new File(jpgPath);
                    //获取图片信息
                    BufferedImage image=(BufferedImage)converter.getBufferedImage(f);
                    //进行图像处理
                    BufferedImage resultImage=new BufferedImage(f.imageWidth,f.imageHeight,BufferedImage.TYPE_3BYTE_BGR);
                    //把image图像信息，化到resultImage上
                    resultImage.getGraphics().drawImage(
                            image.getScaledInstance(f.imageWidth,f.imageHeight, Image.SCALE_DEFAULT),0,0,null
                    );
                    //生成视频的预览图
                    ImageIO.write(image,"jpg", jpgFile);
                    poster=true;
                }
            }
            //去除的帧组合成gif
            en.addFrame(converter.convert(ff.grabFrame()));
            //设置接下来要读的帧的位置
            ff.setFrameNumber(ff.getFrameNumber()+margin);
        }
        en.finish();
        ff.stop();
        ff.close();

        return filePath.substring(0,filePath.lastIndexOf("."));
    }

//    public static void main(String[] args) {
//        try {
//            buildGif("E:\\TEST\\123.MP4", 5, 50, 10, 2);
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }
}
